

{
  //1. 定义类型别名的
  //定义一个接口
  interface Car {
    brand: string;
    price: number;
    color: string;
  }

  //声明一个类型的别名
  type QiChe = Car;
  type Cars = Car[];

  //声明变量 保存汽车的数组
  let qiche: Cars = [
    {
      brand: "比亚迪",
      price: 150000,
      color: "白色",
    },
    {
      brand: "五菱宏光",
      price: 50000,
      color: "灰色",
    },
  ];

  //Key
  type Key = number | string;

  let k: Key = '100';
  k = 123;

  //2. 获取某个变量的类型
  let test: number = 100;
  //这里的 typeof 与 JS 的typeof 是不一样的
  type TestType = typeof test;

  //3. 获取接口键名的联合类型
  let biyadi: QiChe = {
    brand: "比亚迪",
    price: 150000,
    color: "白色",
  };

  //获取汽车的某个属性   keyof QiChe   =  'brand' | 'price' | 'color'
  function getCarInfo(car: QiChe, attr: keyof QiChe){
    return car[attr];
  }
  //调用
  console.log(getCarInfo(biyadi, 'color'));

  //4. 获取函数返回值的类型
  function t(a: number, b: number): number{
    return a * b * a * b;
  }

  //获取函数的类型
  type tType = typeof t;
  //获取函数返回值的类型   ReturnType 是一个内置的接口
  type tRetType = ReturnType<typeof t>;
  //获取函数参数的类型, 返回的类型是一个『元组类型』
  type tParamsType = Parameters<typeof t>;
  //使用接口的某个属性值的类型, 约束类型
  let abc: Car['price'];

  //5. 变量的类型声明 
  $('body').css('background', '#aef');

  //6. 内置类型
  // let d: Date = new Date();

  // DOM 对象
  let div: HTMLDivElement = document.querySelector('div') as HTMLDivElement;
}
